package DAO;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import java.text.Collator;
import java.util.Locale;

import ConexaoBackupBD.ConexaoBD;
import ConexaoBackupBD.MetodosVerificacaoBD;
import BD.TurmaBD;

public class TurmaDAO {
    
    //Conexão com o banco de dados
    ConexaoBD conBD = new ConexaoBD();
    
    //Metodos unique, auto incremento, chave composta
    MetodosVerificacaoBD metBD = new MetodosVerificacaoBD();
    
    Statement BDTurma;
    ResultSet rs;

    //Utilizada para comparar strings
    Collator collator = Collator.getInstance (new Locale ("pt", "BR"));

    public int autoIncremento(){
        return metBD.autoIncremento("turma", "cod_turma");
    }

    public boolean inserirTurma(TurmaBD tur){
        try
        {
            Connection con = conBD.conectar();

            if(metBD.unique("turma", "nome_turma", tur.getNome())){ //nome duplicado
                BDTurma = con.createStatement();

                BDTurma.execute("INSERT INTO turma VALUES ('"+tur.getCodigo()+"', "
                        + " '" + tur.getNome() + "', '" + tur.getCodCurso() + "', "
                        + " '" + tur.getAno() + "');");

                JOptionPane.showMessageDialog(null,"Cadastro Realizado com Sucesso",
                        "Cadastro", JOptionPane.INFORMATION_MESSAGE);

                con.close();
                return true;    
            }
            else{
                JOptionPane.showMessageDialog(null,"Turma com este nome já existe",
                        "Nome duplicado", JOptionPane.ERROR_MESSAGE);
                con.close();
                return false;
            }           
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco",
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);       
        }       
        return false;
    }

    public List<TurmaBD> filtro(String campo, String valor) {      
        List<TurmaBD> listaFiltro = new ArrayList<TurmaBD>(); 
        try { 
            Connection con = conBD.conectar();

            BDTurma = con.createStatement();
            rs = BDTurma.executeQuery("select t.cod_turma, t.nome_turma, "
                    + " t.cod_curso,t.ano_turma, c.nome_curso "
                    + " from turma t, curso c "
                    + " where t.cod_curso = c.cod_curso and "
                    + " "+campo+" like '" + valor + "%'");

            if (rs != null) { 
                while (rs.next()) { 
                    TurmaBD tur = new TurmaBD();
                    tur.setCodigo(rs.getInt("cod_turma"));
                    tur.setNome(rs.getString("nome_turma"));
                    tur.setCodCurso(rs.getInt("cod_curso"));
                    tur.setAno(rs.getInt("ano_turma"));
                    tur.setNomeCursoAux(rs.getString("nome_curso"));
                    listaFiltro.add(tur); 
                }
                con.close();
                return listaFiltro; 
            }else { 
                return null; 
            } 
        } catch (SQLException e) { 
            return null; 
        } 
    }

    public boolean alterarTurma(TurmaBD tr){
        String sql = "update turma set nome_turma = ?, "
                + " cod_curso = ?, ano_turma = ? ";
        sql += " where cod_turma = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
            PreparedStatement ps = con.prepareStatement(sql);

            //Obtem o nome da turma e compara com o  
            //que foi ENVIADO para alteração (tr.get = o que o usuario digitou (novo))
            // SELECT ira obter o atual para aquele codigo
            BDTurma = con.createStatement();
            rs = BDTurma.executeQuery("SELECT nome_turma from turma "
                    + " where cod_turma = '"+tr.getCodigo()+"'");
            rs.first();
            String capturaNome = rs.getString("nome_turma");

            //seta o nível de diferença quando forem comparadas
            collator.setStrength(Collator.PRIMARY);

            if(metBD.unique("turma", "nome_turma", tr.getNome()) || collator.compare(capturaNome, tr.getNome()) == 0 ){ 

                ps.setString(1, tr.getNome());
                ps.setString(2, (String.valueOf(tr.getCodCurso())));
                ps.setString(3, (String.valueOf(tr.getAno())));
                ps.setString(4, (String.valueOf(tr.getCodigo())));

                if (ps.executeUpdate() > 0) {
                    JOptionPane.showMessageDialog(null,"Alteração realizada com sucesso", 
                            "Alterar", JOptionPane.INFORMATION_MESSAGE);
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }                             
            }else{
                JOptionPane.showMessageDialog(null,"Turma já existe",
                        "Nome duplicado", JOptionPane.INFORMATION_MESSAGE);
                return false;
            }                                     
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }    

    public boolean excluirTurma(TurmaBD tur){
        String sql = "delete from turma where cod_turma = ?";   

        try {
            Connection con = conBD.conectar();
            BDTurma = con.createStatement(); 

            //verificar se turma possui disciplinas cadastradas            
            rs = BDTurma.executeQuery("SELECT count(cod_turma) from turmadisciplina "
                    + "where cod_turma = '"+tur.getCodigo()+"' ");
            rs.first();
            int capturaForeign = rs.getInt(1);

            if(capturaForeign >= 1){
                JOptionPane.showMessageDialog(null,"Turma contém disciplinas cadastradas,"
                        + " não pode ser excluída", 
                        "Excluir", JOptionPane.INFORMATION_MESSAGE);
                con.close();
                return false;                   
            }
            else{               
                PreparedStatement ps = con.prepareStatement(sql);
                ps.setString(1, (String.valueOf(tur.getCodigo())));

                if (ps.executeUpdate() > 0) {
                    con.close();
                    return true;
                } else {
                    con.close();
                    return false;
                }           
            }      
        } catch (SQLException e) {
                JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                "Erro no banco", JOptionPane.ERROR_MESSAGE);
                return false;
        }
    }

    public List<TurmaBD> carregarComboAno(int valorCondicao){
        List<TurmaBD> listaTurma = new ArrayList<TurmaBD>();//lista para Codigo + nome
        try
        {      
            Connection con = conBD.conectar();         
            BDTurma = con.createStatement();
            rs = BDTurma.executeQuery("SELECT cod_turma, nome_turma "
                    + " from turma where "
                    + " ano_turma  = '"+valorCondicao+"' ");

            TurmaBD selecioneTurma = new TurmaBD();
            selecioneTurma.setCodigo(-1);
            selecioneTurma.setNome("-- Selecione uma turma --");
            listaTurma.add(selecioneTurma);
            
            while(rs.next()){
                TurmaBD tr = new TurmaBD();
                tr.setCodigo(rs.getInt("cod_turma"));
                tr.setNome(rs.getString("nome_turma"));
                listaTurma.add(tr);
            }  
            con.close();  
            return listaTurma;
        }
        catch (SQLException ex) {
            JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
                    "Erro no vanco", JOptionPane.ERROR_MESSAGE);
        }
        return listaTurma;
    } 
}
